//
// Created by yearing on 2021/6/24.
//
//==================================================================
// 《剑指Offer——名企面试官精讲典型编程题》代码
// 作者：何海涛
//==================================================================

// 面试题15：二进制中1的个数
// 题目：请实现一个函数，输入一个整数，输出该数二进制表示中1的个数。例如
// 把9表示成二进制是1001，有2位是1。因此如果输入9，该函数输出2。
#include "stdio.h"

int numberof1(int n)
{
    int count = 0;
    unsigned int flag = 1;
    while(flag)
    {
        if(flag & n)
            count++;
        flag = flag<<1;
    }
    return  count;
}
int numberof1_2(int n)
{
    int count =  0;
    while(n)
    {
        count++;
        n = n&(n-1);
    }
    return  count;
}
void Test(int number,int test)
{
    int value = numberof1(number);
    if(value ==  test)
        printf("1.number:%p bitCount:%d can pass\n",number,value);
    else
        printf("1.number:%p bitCount:%d cannot pass\n",number,value);
    int value2 = numberof1_2(number);
    if(value2 ==  test)
        printf("2.number:%p bitCount:%d can pass\n",number,value);
    else
        printf("2.number:%p bitCount:%d cannot pass\n",number,value);
}
int main()
{
    Test(0,0);
    Test(1,1);
    Test(9,2);
    Test(307,5);
    Test(0x7fffffff,31);
    Test(0x80000000,1);
    Test(0xffffffff,32);
    return 0;
}
